package com.zhx.learn.redis.controller;

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.*;

/**
 * describe:
 *
 * @author zhanghaixuan
 * @date 2018/09/06
 **/
@RestController
@RequestMapping("/redis")
public class RedisController {

    private String redis =  "before";

    private final static String tag = "test";

    /**
     * @Cacheable  次注解会缓存当前返回的内容
     * param value 缓存的唯一key值  推荐使用 名字+方法名
     * param key 可以根据参数缓存不同的类型
     * @param str 传入的键值
     * @return String
     */
    @Cacheable(value=tag,key = "#str")
    @GetMapping("/get/{str}")
    public String getCache(@PathVariable String str){
        System.out.println("看到我代表没进缓存");
        return redis+str;
    }

    /**
     * @CacheEvict 会清空 value 所指定的 缓存
     * param allEntries  会清空value所有值 不需要指定key值
     * param beforeInvocation 在方法执行之前就会清空
     */
    @CacheEvict(value = tag, allEntries=true,beforeInvocation=true)
    @GetMapping("/deleteCahce")
    public void deleteCahce(){
        System.out.println("清空缓存");
    }

    /**
     * @CachePut 每次都会执行方法内部  会将东西缓存起来  使用方法和 @Cacheable  类似
     * @param str 传入的键值
     * @return String
     */
    @CachePut(value = tag,key = "#str")
    @GetMapping("/addCaches/{str}")
    public String addCache(@PathVariable String str){
        System.out.println("添加缓存");
        return redis+str;
    }

}
